package com.sz.biz.logistics.ord.service;

import com.sz.biz.logistics.core.entity.ProductServiceRel;
import com.sz.biz.logistics.ord.dto.OrdOrderOptionService;
import com.sz.biz.logistics.ord.entity.OrdServiceAssign;
import com.sz.biz.logistics.billing.dto.QuotationCalcObject;

import java.util.List;
import java.util.Map;

/**
 * Function: //TODO ADD FUNCTION. <br>
 * Date: 2017年10月18日 17:19 <br>
 * Author: wentao.chang
 */
public interface OrdOrderServiceAssignService {

    /**
     * cron 定时任务调用
     */
    void cron();

    /**
     * 提交计算的运单号
     *
     * @param orderNo
     * @param serviceTypeCode 当前订单进行到的阶段
     */
    void submitBill(String orderNo, String serviceTypeCode);

    /**
     * 运单号
     *
     * @param orderNo
     * @param serviceTypeCode
     */
    void calc(String orderNo, String serviceTypeCode);

    OrdServiceAssign calcForTry(QuotationCalcObject calcObject);

    OrdServiceAssign findOkAssignByOrderNo(String orderNo);


    /**
     * 查询最新的一条数据，无论是否分派成功
     *
     * @param orderNo 订单编码
     * @return 查询的结果，可能为null
     */
    OrdServiceAssign findByOrderNo(String orderNo);
    /**
     * 根据订单号、服务的uid来获取下一个服务是哪个
     *
     * @param orderNo    订单号
     * @param serviceUid 上个服务的uid
     * @return 获取到的服务信息，如果没有获取到，则返回null
     */
    OrdOrderOptionService findNextServices(String orderNo, String serviceUid);

    void insert(OrdServiceAssign ordServiceAssign);

    ProductServiceRel filterWellConditions(List<ProductServiceRel> fixedLeftServices, QuotationCalcObject calcObject);

    /**
     * 根据订单号批量查询 订单中同服务类型多服务的分派表
     *
     * @param orderNoList 运单编号集合
     * @param isAssignOk
     * @return 数据集合
     */
    List<OrdServiceAssign> findByOrderNos(List<String> orderNoList, Boolean isAssignOk);

    Map<String, OrdServiceAssign> findMapByOrderNos(List<String> orderNoList);

    /**
     * 根据订单号获取指定订单最新的分派信息，无论结果成功与否
     *
     * @param orderNo 订单号
     * @return 无论是不计费成功，只要有数据就返回。
     */
    OrdOrderOptionService getFirstServiceInfoByOrderNo(String orderNo);

    List<OrdOrderOptionService> findOrderServiceByOrderNo(String orderNo, Boolean isAssignOk);
    List<OrdOrderOptionService> findOrderServiceByOrderNo(String orderNo);

    OrdServiceAssign findByOrderNosWithoutAssign(String orderNo);

}
